package com.example.demo.hot100;

import java.util.Arrays;

/**
 * @Classname no16
 * @Description
 * @Date 2023/12/21 9:58
 * @Created by jyl
 *
 * 在数组中找到三个数的和最接近目标数的情况。
 *
 *
 * 同样使用了双指针的思想。遍历数组时，对于每个固定的元素，使用两个指针在剩余数组中寻找最接近目标的和。
 * 在遍历的过程中，通过比较当前和与目标值的差距，更新最接近目标的和。
 * 在 main 方法中，你可以修改 nums 数组和 target 的值并运行程序来测试不同的输入。
 * 在上述代码中，例子是数组 {-1, 2, 1, -4} 和目标值 1。
 */


public class no16 {

    public static int threeSumClosest(int[] nums, int target) {
        if (nums == null || nums.length < 3) {
            throw new IllegalArgumentException("Input array must have at least three elements.");
        }

        Arrays.sort(nums);
        int closestSum = nums[0] + nums[1] + nums[2];

        for (int i = 0; i < nums.length - 2; i++) {
            int left = i + 1;
            int right = nums.length - 1;

            while (left < right) {
                int currentSum = nums[i] + nums[left] + nums[right];

                if (Math.abs(target - currentSum) < Math.abs(target - closestSum)) {
                    closestSum = currentSum;
                }

                if (currentSum < target) {
                    left++;
                } else if (currentSum > target) {
                    right--;
                } else {
                    // 如果找到和等于目标数，则直接返回
                    return currentSum;
                }
            }
        }

        return closestSum;
    }

    public static void main(String[] args) {
        // Example usage:
        int[] nums = {-1, 2, 1, -4};
        int target = 1;
        int closestSum = threeSumClosest(nums, target);
        System.out.println("Closest sum to target " + target + " is: " + closestSum);
    }

}
